#include <string>
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;

class Livestock {
public:
  // 1. 一共有哪些牛参与了挤奶
  vector<string> cows;

  // 2. 一共有多少条要遵守的挤奶规则？
  int numberOfRules;

  // 3. 位于 X 位置的牛有哪些？
  vector<string> xCows;

  // 4. 位于 Y 位置的牛有哪些？
  // xCows[0] 应该和 yCows[0] 在一起挤奶
  // xCows[1] 应该和 yCows[1] 在一起挤奶
  // ...
  vector<string> yCows;

  // 5. 合法的答案
  vector<string> ans;

  Livestock(const string &inputFilename) {
    // 读取 inputFilename 代表的文件，初始化属性
    cows = {
      "Bessie", "Buttercup", "Belinda", "Beatrice", 
			"Bella", "Blue", "Betsy", "Sue"
    };

    ifstream ifs(inputFilename);
    // numberOfRules
    ifs >> numberOfRules;

    for (int i = 0; i < numberOfRules; ++i) {
      string s;
      ifs >> s; 
      xCows.push_back(s);

      string t;
      ifs >> t; // must
      ifs >> t; // be
      ifs >> t; // milked
      ifs >> t; // beside

      ifs >> s; // yCow name
      yCows.push_back(s);
    }
    // xCows
    // yCows

    ans = {};
  }

  // 如果 getIndex 返回 -1，说明 name 不在 ans 里。
  int getIndex(const string &name) {
    for (int i = 0; i < ans.size(); ++i) {
      if (ans[i] == name) {
        return i;
      }
    }

    return -1;
  }

  // 判断是否可以把名字为 name 的奶牛放到 ans 里，可以的话返回 true，否则返回 false。 
  bool canBePickedUp(const string &name) {
    // ...
  }

  // 解决算法
  // ["Bessie", "Buttercup", "Belinda", "Beatrice", "Bella", "Blue", "Betsy", "Sue"]
  //   ^nextCow = 4
  // ["Belinda", "Beatrice", "Bella"]
  void solution() {
    // 1. 遍历所有奶牛的名字
    // int n = 0;
    // while (n <= cows.size() - 1) {
    //   for (string name : cows) {
    //     if (canBePickedUp(name)) {
    //       ans.push_back(name);
    //       // break;
    //     }
    //   }
    //   ++n;
    // }
    

    for (int i = 0; i < cows.size(); ++i) {
      // 2. 下一个可以加入到 ans 的奶牛在 cows 数组的位置
      int nextCow = 0;
      while (!canBePickedUp(cows[nextCow])) {
        ++nextCow;
      }

      // 3. cows[nextCow] 添加到 ans 里
      ans.push_back(cows[nextCow]);
    }
  }
};

int main(int argc, char const *argv[])
{
  /* code */
  // 创建一个自定义类型的变量
  // 本质上调用这个自定义类型的构造函数
  Livestock ls("input.in");

  // 打印规则的数量
  cout << ls.numberOfRules << endl;
  // 打印所有的 x 牛
  
  // 打印所有的 y 牛

  return 0;
}
